/*!
 * @file particle.hh
 * @brief Obiekt emitujący cząsteczki
 */

#ifndef __ENGINE_BASIC_PARTICLE_HH
#define __ENGINE_BASIC_PARTICLE_HH

#include <list>

#include "engine/pawirr.hh"
#include "engine/basic/inifile.hh"
#include "engine/basic/point3f.hh"

/*!
 * @brief Klasa pomocnicza. Kontener na informacje o drobinie
 * [wiele drobin = np. dym]
 */
class __particleDust {
public:
	/*!
	 * @brief Położenie
	 */
	point3f pos;

	/*!
	 * @brief Kierunek przemieszczania
	 */
	point3f vec;

	/*!
	 * @brief Procent drogi [0-1] pomiędzy starem, a punktem oddalonym
	 * o maxDist+fadeoutDist
	 */
	float liveProgress;

	/*!
	 * @brief Kolor
	 */
	color cl;

	/*!
	 * @brief Wylosowany numer tekstury
	 */
	int texNumber;

private:
};

/*!
 * @brief Obiekt emitujący cząsteczki.
 */
class particle {
public:
	/*!
	 * @brief Konstruktor. Inicjalizuje wsio. Ponadto rejestruje
	 * cząstkę w obiekcie gfxParticles w celu ciągłości animacji.
	 * @param pstatic Pozycja emitera
	 * @param vector Kierunek wyrzucania cząstek
	 * @param cfg Plik z konfiguracją
	 * @return Obiekt
	 */
	particle(point3f pstatic, point3f vector, std::string cfg);

	/*!
	 * @brief Wywołuje usunięcie cząstki z gfxParticles
	 * @return -
	 */
	~particle();

	/*!
	 * @brief Obliczanie cząstek
	 */
	void calculate();

	/*!
	 * @brief Malowanie cząstek
	 */
	void paint();

private:
	/*!
	 * @brief Pozycja źródła
	 */
	point3f position;

	/*!
	 * @brief Kierunek wypluwania cząstek
	 */
	point3f vector;

	/*!
	 * @brief Plik z konfiguracją cząsteczki
	 */
	inifile *cfg;

	/*!
	 * @brief Ilość tekstur
	 */
	int texCount;

	/*!
	 * @brief Tekstury
	 */
	texture **tex;

	/*!
	 * @brief Lista drobinek
	 */
	std::list<__particleDust *> *pdust_stack;

	/*!
	 * @brief Max Ilośc drobinek
	 */
	int maxDust;

	/*!
	 * @brief Maksymalna odległość na jaką się mogą oddalić nienaruszone
	 */
	float maxDist;

	/*!
	 * @brief Odcinek na jakim cząstka robi fadeout
	 */
	float fadeoutDist;

	/*!
	 * @brief Prawdopodobieństwo emisji drobinki [0-100]
	 */
	int emmisionProbability;

	/*!
	 * @brief Rozmiar początkowy
	 */
	float sizeAtBegin;

	/*!
	 * @brief Rozmiar końcowy
	 */
	float sizeAtEnd;

	/*!
	 * @brief Rozrzut. 0=idealne, 50=do 90stopni, 100=wszystkie kierunki
	 */
	int spread;

	/*!
	 * @brief Kolor emitowanych cząstek [miksowany z teksturą]
	 */
	color dustColor;

	/*!
	 * @brief Mozliwa zmiana koloru
	 */
	float deltaRGB;

};

#else
class particle;
#endif
